匿名函数
在函数表达式中,创建一个函数并将它赋值给一个变量,若此时function关键字后没有标识符,那么创建的函数可称为匿名函数
匿名函数中的this指向
在一般情况下,this对象是在运行时基于函数的执行环境绑定的。若是在全局函数中,则this指向window;当函数被作为某个对象的方法调用时,this指向该对象。但是在匿名函数中,因为匿名函数的执行环境具有全局性,所以它的this一般指向window。
var name = "The Window";
var object = {
name : "My Object",
//var that=this; //可以更改this指向,使之指向当前的object对象
getNameFunc : function(){
return function(){
return this.name;
};
}
};
alert(object.getNameFunc()()); // 输出为 The Window“”
上面的代码中,getNameFunc()函数中返回的是匿名函数,匿名函数中的this指向的是window,因此输出的是全局变量the window。
为什么?因为object.getNameFunc()()可以拆解如下
var f = object.getNameFunc(); //返回的是一个匿名函数;
f(); //相当于调用了该匿名函数,此时的调用者是window对象。所以this会指向window
如果想要匿名函数的this能够执行当前的object对象,那么就要更改this。可以在匿名函数外添加一行:var that=this----即更改this的指向,更改this的指向还可以用call、apply、bind,输出代码改为下面这行即可将this指向更改指向object对象。call、apply、bind是有区别的,共同点是可以改变执行环境上下文且第一个参数都是指定的对象,不同点:1.apply的第二个参数是数组,这一点和call和bind不一样,call和bind可以传递多个参数。2.bind()返回了改变了执行上下文环境的函数但是不会立即执行该函数,而call()和apply()会直接执行该函数。
alert(object.getNameFunc().call(object)); //输出 “my object”
alert(object.getNameFunc().apply(object));
利用bind方法,bind(object)()
alert(object.getNameFunc().bind(object)());
事例如下:
下述为一个匿名自执行函数,诚如所知,函数名实际上只是一个指向函数对象的指针,对于匿名函数而言,没有函数名。将匿名函数用一对圆括号包含表示是一个函数表达式(如:(function() {}),而后面的 () 表示调用
var a=2;
(function() {
var a=3;
return this.a;
})() //输出为 2,this指向的是window